public class Solution {
    public int getSum(int a, int b) {
        // 位运算(异或运算的无进位相加 + 进位相加)
        while (b != 0) {
            // 无进位相加
            int x = a ^ b;
            // 找出进 1 的那个数，由于只有 ‘1 + 1’ 才标识有进位，其他有 ‘0’ 的都不构成进位，所以跟 & 的运算类似
            // 所以用 a & b 就能标出有进位的位置，但是进位是向前进一位，a & b 只是原地标识
            // 故还需要左移一位
            // 接下的不断循环判断 carry 内是否还有 ‘1’，直至进位标识都为 ‘0’，证明位运算没有进位，得出最终结果
            int carry = (a & b) << 1;
            // 此时 a 作为新的 a ^ b
            a = x;
            // b 标识是否还有进位
            b = carry;
        }
        // 由于a 存的是 a ^ b 后的结果，直接return就能拿到进位相加后的结果
        return a;
    }
}
